package br.com.tmd.controlefinanceiro.bean;

import br.com.tmd.controlefinanceiro.modelo.Usuario;
import br.com.tmd.controlefinanceiro.persistence.UsuarioDao;
import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.validation.ConstraintViolationException;
import org.jcommon.encryption.SimpleMD5;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable {

    private Usuario usuarioLogin;
    private Usuario usuario;
    private List<Usuario> lista;
    private String confirmarSenha;
    private String permissao;
    private String senhaAtual;

    public UsuarioBean() {
        usuarioLogin = new Usuario();
        usuario = new Usuario();
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication) {
                usuarioLogin.setLogin(((User) authentication.getPrincipal()).getUsername().toUpperCase());
                UsuarioDao dao = new UsuarioDao();
                usuarioLogin = dao.consultaUsuario(usuarioLogin.getLogin());
            }
        }
    }

    public Usuario getUsuario() {

        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Usuario getUsuarioLogin() {
        return usuarioLogin;
    }

    public void setUsuarioLogin(Usuario usuarioLogin) {
        this.usuarioLogin = usuarioLogin;
    }

    public List<Usuario> getLista() throws Exception {

        UsuarioDao usrDao = new UsuarioDao();
        lista = usrDao.listaFuncionarios();

        return this.lista;
    }

    public String getConfirmarSenha() {
        return confirmarSenha;
    }

    public void setConfirmarSenha(String confirmarSenha) {
        this.confirmarSenha = confirmarSenha;
    }

    public String getPermissao() {
        return permissao;
    }

    public void setPermissao(String permissao) {
        this.permissao = permissao;
    }
    //Apartir daqui métodos da classe

    public String novo() {
        this.usuario = new Usuario();
        // this.usuario.setAtivo(true);
        this.confirmarSenha = null;
        return "usuario?faces-redirect=true";
    }

    public String salvar() {
        FacesContext context = FacesContext.getCurrentInstance();

        String senha = this.usuario.getSenha();
        if (!senha.equals(this.confirmarSenha)) {
            FacesMessage facesMessage = new FacesMessage("Senhas não conferem.");
            context.addMessage(null, facesMessage);
            return null;
        }

       /* UsuarioDao testeLogin = new UsuarioDao();
        String login = this.usuario.getLogin();
        String tipo = "F";
        Usuario usr = testeLogin.buscarPorLogin(login);
        if (usr.getLogin().equalsIgnoreCase(login) && usr.getTipo().equalsIgnoreCase(tipo)) {
            FacesMessage facesMessage = new FacesMessage("Login já existe!");
            context.addMessage(null, facesMessage);
            return null;
        }*/
        /*
         * Apartir daqui salva ou altera o usuário no banco de dados.
         */
        UsuarioDao dao = new UsuarioDao();
        Integer codigo = usuario.getCodigo();

        if (codigo == null || codigo == 0) {
            usuario.getPermissao().add("ROLE_USUARIO");
            usuario.setTipo("F");
            this.usuario.setDataCadastro(Calendar.getInstance());
            this.usuario.setAtivo(true);
            SimpleMD5 md5 = new SimpleMD5(this.usuario.getSenha(), "");
            this.usuario.setSenha(md5.toHexString());
            dao.salvar(this.usuario);
            /*try {
                dao.salvar(this.usuario);
            } catch (ConstraintViolationException e) {
                throw new RuntimeException("Login Já está cadastrado!");

            }*/

        } else {
            if (!senhaAtual.equalsIgnoreCase(senha)) {
                this.confirmarSenha = this.usuario.getSenha();
                SimpleMD5 md5 = new SimpleMD5(this.usuario.getSenha(), "");
                this.usuario.setSenha(md5.toHexString());
                dao.alterar(this.usuario);
            } else {
                dao.alterar(this.usuario);
            }
        }

        this.usuario = new Usuario();
        this.confirmarSenha = null;
        return "usuario?faces-redirect=true";

    }

    public void excluir() {
        UsuarioDao dao = new UsuarioDao();
        dao.excluir(usuario);
    }

    public String editar() {

        this.confirmarSenha = usuario.getSenha();
        this.senhaAtual = usuario.getSenha();
        //Foi setado o valor no codigo cliente para aparecer o valor do banco no selectOneMenu

        return "usuario?faces-redirect=true";
    }

    public String atribuiPermissao(Usuario usuario, String permissao) {
        this.usuario = usuario;
        UsuarioDao dao = new UsuarioDao();
        Set<String> permissoes = this.usuario.getPermissao();
        if (permissoes.contains(permissao)) {
            permissoes.remove(permissao);
            dao.alterar(usuario);
        } else {
            permissoes.add(permissao);
            dao.alterar(usuario);
        }
        return null;
    }

    public String ativar() {
        if (this.usuario.isAtivo()) {
            this.usuario.setAtivo(false);
        } else {
            this.usuario.setAtivo(true);
        }
        UsuarioDao dao = new UsuarioDao();
        dao.alterar(usuario);
        return null;
    }

    //Redireciona para página princiapal
    public String formPrincipal() {
        return "principal?faces-redirect=true";
    }

    //Redireciona para página consultaUsuario
    public String consultarUsuario() {
        return "consultaUsuarios?faces-redirect=true";
    }
}
